package com.igelato;

import com.igelato.response.AppException;
import com.igelato.response.ErrorCodeMsgEnum;
import com.igelato.response.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;


/**
 * @Description: 全局异常拦截器
 * @Author: wht
 * @Date: 2023-12-24
 */
@Slf4j
@ControllerAdvice
// 加了@ControllerAdvice这个之后，springboot碰到抛出异常就会自动执行这个类里的exceptionHandler方法
public class GlobalExceptionHandler {
    @ExceptionHandler(value = {Exception.class})
    @ResponseBody
    public <T> R<T> exceptionHandler(Exception e) {
        log.info("error-------" + e.getMessage());

        if (e instanceof AppException) {
            //这里先判断拦截到的Exception是不是我们自定义的异常类型
            AppException appException = (AppException) e;
            return R.error(appException.getErrorCodeMsgEnum());
        } else if (e instanceof BindException) {
            // 再拦截@Valid抛出的异常
            BindException er = (BindException) e;
            String defaultMessage = er.getBindingResult().getAllErrors().get(0).getDefaultMessage();
            return R.error(20000, defaultMessage);
        } else {
            //如果拦截的异常不是我们自定义的异常(例如：数据库主键冲突)
            return R.error(ErrorCodeMsgEnum.SERVICE_ERROR);
        }
    }
}
